package com.java.bytebuddy;

import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;
import net.bytebuddy.implementation.bind.annotation.SuperCall;
import net.bytebuddy.implementation.bind.annotation.This;

import java.lang.reflect.Method;
import java.util.concurrent.Callable;

/**
 * @author dushougudu
 */
public class MyInterceptor {
    /**
     * 因为这个方法是在运行中进行的 所以我们要加上 @RuntimeType
     * 方法需为静态方法
     *
     * @param method   第一个参数是反射获取的方法 需要使用@Origin注解
     * @param callable 第二个参数为Callable 需要@SuperCall 注解
     * @return 返回类型为Callable对象 但是我们不清楚对象是什么状态的 所以这里使用Object
     * @throws Exception
     */
    @RuntimeType
    public static Object intercept(@Origin Method method, @This Object object,
                                   @SuperCall Callable<?> callable) throws Exception {
        // 获取当前系统时间
        Long start = System.currentTimeMillis();
        try {
            System.out.println(System.currentTimeMillis());
            // 获取当前执行方法的结果
            return callable.call();
        } finally {
            System.out.println(System.currentTimeMillis());

        }
    }
}
